package show.lmm;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.RemovalCause;

import java.util.concurrent.TimeUnit;

public class CaffeineCache {
    public static void main(String[] args) throws InterruptedException {
        Cache<Integer, String> cache = Caffeine.newBuilder()
                //设置缓存的初始容量为10
                .initialCapacity(10)
                // 设置缓存最大容量为100，超过100之后就会按照LRU最近最少使用算法来移除缓存
                .maximumSize(100)
                //设置写缓存后8秒钟过期
                .expireAfterWrite(8, TimeUnit.SECONDS)
                //设置要统计的缓存命中率
                .recordStats()
                //设置缓存移除通知
                .removalListener((Integer key, String value, RemovalCause cause) -> {
                    System.out.println("缓存删除了！！！！");
                })
                //build方法可以指定CacheLoader，在缓存不存在时通过CacheLoader的实现自动加载缓存
                .build();

        //cache.put(1 , "value");
        for (int i = 0; i < 20; i++) {
            String str = cache.get(1, key -> key + "value");
            System.out.println(str);
            //休眠一秒
            TimeUnit.SECONDS.sleep(1);
            if (i == 10) {
                cache.put(1, "value");
                System.out.println("---------------------");
                System.out.println(cache.getIfPresent(1));
                //删除缓存
                cache.invalidate(1);
                System.out.println("---------------------");
            }
        }
    }
}